<?php
/**
 * 调试辅助类
 * @package Helper 
 * @author Chengxuan <chengxuan@leju.sina.com.cn>
 * @version #Id:debug.php 2010-5-26 上午10:02:27#
 */
class Cls_Debug
{
	static public $_firephp_enabled = true;
	
	/**
	 * 输出资源使用量
	 * @param boolean	$output	是否输出结果
	 */
	static public function resource($output=true)
	{
		$result = array(
			'memory'	=> self::getMemory(),
		);
		
		$output && self::dump($result);
		return $output ? null : $result;		
	}
	
	/**
	 * 取得内存使用量
	 * @return int
	 */
	static public function getMemory()
	{
		return memory_get_usage();
	}
	
	/**
	 * 输出变量的内容
	 *
	 * 如果启用了 FirePHP 支持，将输出到浏览器的 FirePHP 窗口中，不影响页面输出。
	 *
	 * 可以使用 dump() 这个简写形式。
	 *
	 * @code php
	 * dump($vars, '$vars current values');
	 * @endcode
	 *
	 * @param mixed $vars 要输出的变量
	 * @param string $label 标签
	 * @param boolean $return 是否返回输出内容
	 * @return mixed
	 */
	static public function dump($vars, $label = null, $return = false)
	{
		if (! $return && self::$_firephp_enabled)
		{
			self::firephp()->fb($vars, $label);
			return null;
		}
		if (ini_get('html_errors'))
		{
			$content = "<pre>\n";
			if ($label !== null && $label !== '')
			{
				$content .= "<strong>{$label} :</strong>\n";
			}
			$content .= htmlspecialchars(print_r($vars, true));
			$content .= "\n</pre>\n";
		}
		else
		{
			$content = "\n";
			if ($label !== null && $label !== '')
			{
				$content .= $label . " :\n";
			}
			$content .= print_r($vars, true) . "\n";
		}
		if ($return)
		{
			return $content;
		}

		echo $content;
		return null;
	}
	
	/**
	 * 以表格形式输出调试数据
	 * @param array		$vars	二级数组（一般为从数据库中取出的数据）
	 * @param string	$label	标签
	 */
	static public function table($vars, $label='Dump Table')
	{
		if(self::$_firephp_enabled)
		{
			self::firephp()->fb($vars, $label, Cls_FirePHP::TABLE);
			return ;
		}
		
		
		$result = '<table border="1">';
		$field = true;
		foreach($vars as $row)
		{
			if($field)
			{
			  	$result .= '<tr>';
				foreach(array_keys($row) as $item)
				{
			  		$result .= "<th>{$item}</th>";
				}
				$result .= '</tr>';
				$field = false;
			}
			
			$result .= '<tr>';
			foreach($row as $key=>$value)
			{				
				$result .= "<td>{$value}</td>";
			}
			$result .= '</tr>';
		}
		echo $result;
	}
	
	/**
	 * 抛出错误
	 * @param mixed		$vars	要输出的内容
	 * @param string	$label	标签
	 * @param enum		$type	错误类型(Cls_FirePHP::ERROR/Cls_FirePHP::WARN)
	 */
	static public function error($vars, $label='Error', $type=null)
	{
		if(self::$_firephp_enabled)
		{
			!$type && $type = Cls_FirePHP::ERROR;
			self::firephp()->fb($vars, $label, $type);
		}
	}
	
	/**
	 * 追踪访问
	 * @param string $label
	 */
	static public function trace($label='trace')
	{
		if(self::$_firephp_enabled)
		{
			self::firephp()->trace($label);
			return ;
		}
		
		
		$debug = debug_backtrace();
		$lines = '';
		$index = 0;
		for ($i = 0; $i < count($debug); $i ++)
		{
			if ($i == 0)
			{
				continue;
			}
			$file = $debug[$i];
			if (! isset($file['file']))
			{
				$file['file'] = 'eval';
			}
			if (! isset($file['line']))
			{
				$file['line'] = null;
			}
			$line = "#{$index} {$file['file']}({$file['line']}): ";
			if (isset($file['class']))
			{
				$line .= "{$file['class']}{$file['type']}";
			}
			$line .= "{$file['function']}(";
			if (isset($file['args']) && count($file['args']))
			{
				foreach ($file['args'] as $arg)
				{
					$line .= gettype($arg) . ', ';
				}
				$line = substr($line, 0, - 2);
			}
			$line .= ')';
			$lines .= $line . "\n";
			$index ++;
		} # for

		$lines .= "#{$index} {main}\n";

		if (ini_get('html_errors'))
		{
			echo nl2br(str_replace(' ', '&nbsp;', $lines));
		}
		else
		{
			echo $lines;
		}
	}
	
	/**
	 * 取得FirePHP对象
	 * @return Cls_FirePHP
	 */
	static public function firephp()
	{
		return Cls_FirePHP::getInstance(true);
	}
}